#include "actorManager.h"
#include "Player.h"


actorManager::actorManager(void)
	{
		G_EVENTOS->addListener(NUEVO_ACTOR,this);
		G_EVENTOS->addListener(ACTOR_MOVIDO,this);
		G_EVENTOS->addListener(CARGANDO_MAPA,this);
	}

bool actorManager::onEvent( Event *e )
	{
		if (e->tipo == NUEVO_ACTOR){
			eventoNuevoActor *dataActor = (eventoNuevoActor *)e->datos;
			addActor(dataActor->actor);
		}else if (e->tipo == ACTOR_MOVIDO){
			eventoActorMovido *dataMovimiento = (eventoActorMovido *)e->datos;
			onActorMovement(dataMovimiento->actor,dataMovimiento->destinoX,dataMovimiento->destinoY);
		}			
		else if (e->tipo == CARGANDO_MAPA){
			//eliminamos a todos los actores, de nuestra lista y de la general
			hash_map<ID,NPC*>::iterator it;

			for (it = npcs.begin(); it != npcs.end(); ++it){
				g->removeActor(it->first);
				delete it->second;
			}
			npcs.clear();


			eventoCargaMapa *dataMapa = (eventoCargaMapa*)e->datos;
			mapa = dataMapa->map;
			
		}

		return false;
	}

void actorManager::addActor( Actor *a )
	{
	if (a->getTipo() == Actores::NPC)
		npcs[ a->getID() ] = dynamic_cast<NPC*>(a);
	}


/************************************************************************/
/* Comprobamos la posicion de cada npc respecto al jugador				*/
/************************************************************************/
void actorManager::onActorMovement( Actor *a, float destinoX, float destinoY )
	{

		
		if (a->getTipo() == Actores::JUGADOR){
			

			int anchoTile	= mapa->getAnchoTile();
			int altoTile	= mapa->getAltoTile();

			int xTile		= destinoX;
			int yTile		= destinoY;
			

			hash_map<ID,NPC*>::iterator it;

			for (it = npcs.begin(); it != npcs.end(); ++it){
				int tileX = it->second->getX() / anchoTile;
				int tileY = it->second->getY() / altoTile;
				if ((max(tileX,xTile) - min(tileX,xTile) <= it->second->getRangoVision()) && (max(tileY,yTile) - min(tileY,yTile) <= it->second->getRangoVision()))
					it->second->onAproximacion(a);

			}

		}
	}


void actorManager::update( float speedFactor )
	{

	}

actorManager::~actorManager(void)
	{
	}
